home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DEMOS / PUMPSRC.ZIP / DFORM.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-27  |  6.3 KB  |  235 lines

  1.  
  2. #include "pump.h"
  3.  
  4. PRIVATE byte (*ctable)[256] = NULL;
  5.  
  6. PRIVATE byte FindNearestClr(sint32 tr, sint32 tg, sint32 tb) {
  7.     int i, found_best = -1, found_best_dist = 0x7FFFFFFF;
  8.  
  9.     for (i = 0; i < 256; i++) {
  10.         sint32 dist, x, y, z;
  11.         x = tr - (((sint32) GL_Pal[i*3]) << 8);
  12.         y = tg - (((sint32) GL_Pal[i*3+1]) << 8);
  13.         z = tb - (((sint32) GL_Pal[i*3+2]) << 8);
  14.         dist = x*x + y*y + 3*z*z;
  15.         if (dist < found_best_dist) {
  16.             found_best = i;
  17.             found_best_dist = dist;
  18.         }
  19.     }
  20.     if (found_best == -1) found_best = 0;
  21.     return found_best;
  22. }
  23.  
  24. #define TRUQUILLO
  25. #define WEIGHT_NEW 1
  26. #define WEIGHT_OLD 7
  27.  
  28. PRIVATE void InitCTable(void) {
  29.     int i, j;
  30.  
  31.     if (ctable == NULL) {
  32.         ctable = NEW(256*256);
  33.         if (ctable == NULL)
  34.             BASE_Abort("Alloc ctable");
  35.     }
  36.     if (JCLIB_Load("pal.mix", ctable, 256*256) < 256*256) {
  37.         FILE *fd;
  38.         for (i = 0; i < 256; i++) {
  39.             for (j = 0; j < 256; j++) {
  40.                 sint32 tr, tg, tb;
  41.                 byte nearest;
  42.                 tr =
  43.                     (
  44.                         (
  45.                                 WEIGHT_NEW * (((uint32)GL_Pal[i*3]) << 8)
  46.                             +   WEIGHT_OLD * (((uint32)GL_Pal[j*3]) << 8)
  47.                         )
  48.                     / (WEIGHT_NEW + WEIGHT_OLD)
  49.                 );
  50.                 tg =
  51.                     (
  52.                         (
  53.                                 WEIGHT_NEW * (((uint32)GL_Pal[i*3+1]) << 8)
  54.                             +   WEIGHT_OLD * (((uint32)GL_Pal[j*3+1]) << 8)
  55.                         )
  56.                     / (WEIGHT_NEW + WEIGHT_OLD)
  57.                 );
  58.                 tb =
  59.                     (
  60.                         (
  61.                                 WEIGHT_NEW * (((uint32)GL_Pal[i*3+2]) << 8)
  62.                             +   WEIGHT_OLD * (((uint32)GL_Pal[j*3+2]) << 8)
  63.                         )
  64.                     / (WEIGHT_NEW + WEIGHT_OLD)
  65.                 );
  66.                 nearest = FindNearestClr(tr, tg, tb);
  67. #ifdef TRUQUILLO
  68.                 if (nearest == j)
  69.                     nearest = i;
  70. #endif
  71.                 ctable[i][j] = nearest;
  72.             }
  73.         }
  74.         fd = fopen("pal.mix", "wb");
  75.         if (!fd) {
  76.             BASE_Abort("Create pal.mix");
  77.         }
  78.         if (fwrite(ctable, 1, 256*256, fd) != 256*256) {
  79.             BASE_Abort("Write pal.mix");
  80.         }
  81.         fclose(fd);
  82.     }
  83. }
  84.  
  85. PRIVATE int start_scan = 0;
  86.  
  87. PRIVATE void DumpScr(void) {
  88.     int i;
  89.     byte *pScr = ((byte *)0xA0000) + (start_scan?320:0);
  90.  
  91.     for (i = start_scan; i < 200; i+=2) {
  92.         memcpy(pScr, LLS_Screen[i], 320);
  93.         pScr += 320*2;
  94.     }
  95.     start_scan ^= 1;
  96. }
  97.  
  98. PRIVATE sint32 (*dtable)[256];
  99.  
  100. PUBLIC void InitDForm(void) {
  101.     int i, j;
  102.     DISPOSE(GL_WorkScreen);
  103.     GL_WorkScreen = NEW(3*LLS_Size);
  104.     if (GL_WorkScreen == NULL)
  105.         BASE_Abort("Alloc 3 workscreen");
  106.  
  107.     for (i = 0; i < 3; i++) {
  108.         char buf[100];
  109.         sprintf(buf, "dflogo%d.pix", i+1);
  110.         JCLIB_Load(buf, GL_WorkScreen + LLS_Size*i, LLS_Size);
  111.     }
  112.  
  113.     InitCTable();
  114.  
  115.     dtable = NEW(sizeof(*dtable)*16);
  116.     if (dtable == NULL)
  117.         BASE_Abort("Alloc dtable");
  118.  
  119.     for (i = 0; i < 16; i++) {
  120.         for (j = 0; j < 256; j++) {
  121.             dtable[i][j] = FPMult(i, Cos(j*65536/256));
  122.         }
  123.     }
  124. }
  125.  
  126.  
  127. #define AI_INC 2
  128. #define AJ_INC 2
  129.  
  130. PUBLIC void DoDForm(void) {
  131.     int i, j, i2;
  132.     byte *p;
  133.  
  134.     byte *varea;
  135.     int ai = 0, aj = 0;
  136.     int l, dl;
  137.     bool leave = FALSE;
  138.     int nf = 0;
  139.  
  140.     //outpw(0x3D4, 0x4009);  Ni probar esto!
  141.  
  142.  
  143.     varea = NEW(512*256);
  144.     if (varea == NULL)
  145.         BASE_Abort("Alloc varea");
  146.     memset(varea, 0, 512*256);
  147.     VBL_ZeroPalette();
  148.  
  149.  
  150.         VBL_DestPal = GL_Pal;
  151.         VBL_FadeMode =  VBL_FADEFAST;
  152.         VBL_FadeStartColor = 0;
  153.         VBL_FadeNColors = 256;
  154.         VBL_FadePos = 1;
  155.         VBL_FadeSpeed = 1;
  156.  
  157.     VBL_VSync(0);
  158.     for (i2 = 0; !leave && i2 < 3; i2++) {
  159.         p = GL_WorkScreen + i2*LLS_Size;
  160.         for (i = 0; i < 200; i++)
  161.             memcpy(varea + i*512, p + i*320, 320);
  162.  
  163.         l = 15 << 8;
  164.         dl = 0;
  165.         nf = 0;
  166.         while (!leave) {
  167.             int ti, tj, d;
  168.             int f;
  169.             sint32 *pl;
  170.  
  171.             p = LLS_Screen[start_scan]; // GL_WorkScreen;
  172.             ti = ai;
  173.             pl = dtable + (l >> 8);
  174.  
  175.             if (LLK_SpacePressed != 0)
  176.                 leave = TRUE;
  177.  
  178.             for (i = start_scan; i < 200; i+=2) {
  179.                 tj = aj;
  180.                 d = 512*((i+pl[(ti&255)])&255);
  181.                 for (j = 0; j < 320; j++) {
  182.                     byte b;
  183.                     b = varea[d + ((j+pl[(tj&255)])&511)];
  184.                     *p = ctable[b][*p];
  185.                     p++;
  186.                     tj++;
  187.                 }
  188.                 ti+=2;
  189.                 p+=320;
  190.             }
  191.             ai+=AI_INC;
  192.             aj+=AJ_INC;
  193.             //VGA_SetBorder(0, 0, 0);
  194.             f = VBL_VSync(2);
  195.             DumpScr();
  196.  
  197.             if (nf < 70 && (nf+f) >= 70) {
  198.                 dl = -(1 << 6);
  199.             } else if (nf < 220 && (nf+f) >= 220) {
  200.                 dl = (1 << 6);
  201. //            } else if (nf < 510 && (nf+f) >= 510 && i2 == 2) {
  202.             } else if (nf < 360 && (nf+f) >= 360 && i2 == 2) {
  203.                 VBL_DestPal = NULL;
  204.                 VBL_FadeStartColor = 0;
  205.                 VBL_FadeNColors = 256;
  206.                 VBL_FadeMode =  VBL_FADEFAST;
  207.                 VBL_DestRed = VBL_DestGreen = VBL_DestBlue = 0;
  208.                 VBL_FadePos = 1;
  209.                 VBL_FadeSpeed = 1;
  210. //            } else if (nf < 580 && (nf+f) >= 580) {
  211.             } else if (nf < 430 && (nf+f) >= 430) {
  212.                 break;
  213.             }
  214.             l += f*dl;
  215.             if (l < 0) {
  216.                 dl = 0;
  217.                 l = 0;
  218.             } else if (l >= (15 << 8)) {
  219.                 dl = 0;
  220.                 l = 15 << 8;
  221.             }
  222.             nf += f;
  223.             //VGA_SetBorder(63, 0, 0);
  224.         }
  225.     }
  226.     DISPOSE(varea);
  227.     DISPOSE(ctable);
  228.     DISPOSE(dtable);
  229.  
  230.     DISPOSE(GL_WorkScreen);
  231.     GL_WorkScreen = NEW(LLS_Size);
  232.     if (GL_WorkScreen == NULL)
  233.         BASE_Abort("Alloc 1 workscreen");
  234.  
  235. }